package com.summer.bilibili.util;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 自定义Jackson序列化器，用于控制Long类型的序列化格式。
 * 可通过构造参数选择将Long序列化为数字（默认）或字符串。
 * 使用@JsonSerialize注解时优先级高于全局配置。
 */
public class LongSerializer extends JsonSerializer < Long > {
    // 序列化模式标志：true=数字形式, false=字符串形式
    private final boolean writeNumber;

    /**
     * 默认构造器：启用数字序列化模式
     */
    public LongSerializer () {
        this ( true );
    }

    /**
     * 自定义构造器：可指定序列化模式
     *
     * @param writeNumber 序列化模式选择器
     */
    public LongSerializer ( boolean writeNumber ) {
        this.writeNumber = writeNumber;
    }

    /**
     * 核心序列化逻辑
     *
     * @param value       待序列化的Long值
     * @param gen         JSON生成器
     * @param serializers 序列化上下文
     */
    @Override
    public void serialize ( Long value , JsonGenerator gen , SerializerProvider serializers ) throws IOException {
        if ( value != null ) {// 非空值处理
            if ( writeNumber ) {
                gen.writeNumber ( value );// 序列化为JSON数字
            } else {
                gen.writeString ( value.toString ( ) ); // 序列化为JSON字符串
            }
            // 空值不做处理（保持JSON中为null）
        }
    }
}
